package org.zhuzx.util.spring;

import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.zhuzx.util.JdbcUtil;

import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * Spring数据库组件相关工具类
 * @author zhuzx 2018年08月23日
 */
public class SpringDaoUtil {

	/**
	 * 使用预备语句批量插入数据
	 * @param jdbcTemplate 使用的JdbcTemplate实例
	 * @param tableName 插入的表名
	 * @param list 已处理好的ListMap，与想要插入的数据库表字段精确对应，不可有多余的键。
	 * @param uniqFields 若需要以on duplicate方式处理，则将唯一索引字段列出。
	 */
	@SuppressWarnings({"unused", "NullableProblems"})
	private static <V> void insertByBatch(JdbcTemplate jdbcTemplate, String tableName,
			List<Map<String,V>> list, String... uniqFields) {
		StringBuilder sql = new StringBuilder(tableName);
		final Object[][] values = JdbcUtil.prepareInsertData(sql, list, uniqFields);
		jdbcTemplate.batchUpdate(sql.toString(), new BatchPreparedStatementSetter() {
			@Override
			public void setValues(PreparedStatement ps, int i) {
				Object[] value = values[i];
				JdbcUtil.setRowValue(ps, value);
			}
			@Override
			public int getBatchSize() {
				return values.length;
			}
		});
	}
	
	/**
	 * 插入并获取自增主键值
	 * @return 本条记录的自增主键
	 */
	public static <V> Number insertAndReturnId(JdbcTemplate jdbcTemplate, String tableName,
								   Map<String,V> params) {
		StringBuilder sql = new StringBuilder(tableName);
		final Object[][] values = JdbcUtil.prepareInsertData(sql, Collections.singletonList(params));
		KeyHolder keyHolder = new GeneratedKeyHolder();
		jdbcTemplate.update(connection -> {
			PreparedStatement ps = connection.prepareStatement(sql.toString(), Statement.RETURN_GENERATED_KEYS);
			JdbcUtil.setRowValue(ps, values[0]);
			return ps;
		}, keyHolder);
		return keyHolder.getKey();
	}
	
}